//自己
class Solution {
public:
    void duplicateZeros(vector<int>& arr) {   //duplicate复制
        //为防止从前向后复写时, 后面的元素被覆盖, 我们从后向前复写
        //模拟从前向后复写情况, 找到复写结束时cur, dest的位置
        //然后再从后向前复写
        //1. 
        int cur=0, dest=0;
        size_t size = arr.size();
        while (dest < size)
        {
            if (arr[cur] == 0)
                dest += 2;
            else
                dest += 1;
            ++cur;
        }
        //2. 细节调整: cur dest因为移动的原因都处在被复写/覆盖的元素得下一个位置, --让它们处在被复写/覆盖的最后一个元素处
        --cur;
        --dest;
        //--后仍然越界的一定是上面最后一次移动两位上的, 一定是复写0的, 可以覆盖arr[dest-1], dest越界了, 所以不覆盖
        if (dest >= size)//dest == size
        {
            --dest;
            arr[dest] = 0;//dest==size-1;
            --dest;//准备下一次覆盖/复写
            --cur;
        }
        //3. 开始倒着复写
        while (cur >= 0)
        {
            if (arr[cur] == 0)
            {
                //arr[dest] = arr[dest-1] = 0; dest-=2; //==(arr[dest--] = arr[dest--] = 0;)不建议易出错,不易读, (arr[dest] = arr[--dest] = 0;)这就错了
                arr[dest] = 0;
                arr[dest-1] = 0;
                dest -= 2;
            }
            else //arr[cur] != 0
            {
                arr[dest] = arr[cur];
                --dest;
            }
            --cur;
        }

    }
};

//老师
class Solution {
public:
    void duplicateZeros(vector<int>& arr) 
    {
        int cur=0, dest=-1, n = arr.size();;//dest指向待覆盖位置, 因为还不知道复写谁, 所以初始化为-1
        //1. 模拟从前向后, 确定结束时cur dest位置
        while (cur < n)
        {
            if (arr[cur])  
                ++dest;
            else 
                dest += 2;
            if (dest >= n-1) 
                break;//后面没空了, 跳出
            ++cur;
        }
        //2. 处理边界情况
        if (dest == n)//越界
        {
            arr[n-1] = 0;
            dest -= 2;
            --cur;
        }
        //3. 后->前
        while (cur >= 0)
        {
            if (arr[cur]) 
                arr[dest--] = arr[cur--];
            else
            {
                arr[dest--] = 0;
                arr[dest--] = 0;
                cur--;
            }
        }

    }
};